package com.epadmin.instruktor;

import com.ep.general.ActionSupportCustom;
import com.ep.general.admin.Administrator;
import com.ep.general.app.Utils;
import com.ep.general.instruktor.Instruktor;
import com.ep.general.instruktor.InstruktorMdt;
import com.ep.general.kursant.Kursant;
import com.ep.general.kursant.KursantMdt;
import com.epadmin.app.login.LoginRequierd;

public class InstruktorAction extends ActionSupportCustom<Administrator> implements LoginRequierd {

	private static final long serialVersionUID = 2450063474387891537L;
	private final String INSTRUKTOR_KEY = "instruktor";

	private InstruktorForm form;
	private int instruktorId;
	private int kursantId;
	private InstruktorMdt instruktorMdt;
	private KursantMdt kursantMdt;

	@Override
	public String execute() throws Exception {
		return SUCCESS;
	}

	public String list() {
		setDataArray(new InstruktorView().getData());
		return DATA_ARRAY;
	}

	public String kursanciList() {
		setDataArray(new InstruktorView().getKursanciData(getInstruktorId()));
		return DATA_ARRAY;
	}

	public String getKursanciNotAssignedList() {
		return new InstruktorView().getNieprzypisaniKursanci();
	}

	public String add() {
		getForm().setImie("");
		getForm().setNazwisko("");
		getForm().setLogin("");
		getForm().setHaslo("");
		getForm().setTelefon("");
		getForm().setMiasto("");
		getForm().setUlica("");

		getSession().remove(INSTRUKTOR_KEY);
		getSession().put(INSTRUKTOR_KEY, getForm());

		return EDIT;
	}

	private boolean isValid(Instruktor item, boolean editState) {
		if (!editState && !getInstruktorMdt().checkLoginUnique(item.getLogin())) {
			setText("Podany login już istnieje !");
			return false;
		}

		if (item.getHaslo().length() < 5) {
			setText("Wymagana długość hasła to 5 znaków !");
			return false;
		}

		return true;
	}

	public String edit() {
		getSession().remove(INSTRUKTOR_KEY);
		Instruktor instruktor = getInstruktorMdt().get(getInstruktorId());

		if (instruktor == null) {
			setText("Brak obiektu");
			return TEXT_RESULT;
		}
		getForm().setData(instruktor);
		getSession().put(INSTRUKTOR_KEY, getForm());

		return EDIT;
	}

	public String delete() {
		Instruktor instruktor = getInstruktorMdt().get(getInstruktorId());

		if (instruktor == null) {
			setText("Brak obiektu");
			return TEXT_RESULT;
		}

		getInstruktorMdt().delete(instruktor);

		setText("Instruktor został poprawnie usunięty");
		return TEXT_RESULT;
	}

	public String saveNew() {
		if (getForm().getData() == null) {
			setText("Brak obiektu");
			return TEXT_RESULT;
		}

		if (!isValid(getForm().getData(), false)) {
			return TEXT_RESULT;
		}

		getForm().getData().setHaslo(Utils.convertToMd5(getForm().getData().getHaslo()));
		getInstruktorMdt().makePersistent(getForm().getData());

		getSession().remove(INSTRUKTOR_KEY);
		setText("Instruktor został poprawnie dodany");

		return TEXT_RESULT;
	}

	public String save() {
		Instruktor instruktorEdytowany = ((InstruktorForm) getSession().get(INSTRUKTOR_KEY)).getData();
		Instruktor instruktorNowy = getForm().getData();

		if (instruktorEdytowany == null) {
			setText("Brak instruktora !");
			return TEXT_RESULT;
		}

		if (!isValid(instruktorNowy, true)) {
			return TEXT_RESULT;
		}

		instruktorNowy.setHaslo(Utils.convertToMd5(instruktorNowy.getHaslo()));

		if (!instruktorEdytowany.compareAndCopy(instruktorNowy)) {
			setText("Brak zmian po edycji !");
			return TEXT_RESULT;
		}

		getInstruktorMdt().makePersistent(instruktorEdytowany);
		getSession().remove(INSTRUKTOR_KEY);

		setText("Instruktor został poprawnie zmieniony");
		return TEXT_RESULT;
	}

	public String przypiszKursanta() {
		return "kursantAssign";
	}

	public String assignKursant() {
		Kursant kursant = getKursantMdt().get(getKursantId());

		if (kursant != null) {
			Instruktor instruktor = getInstruktorMdt().get(getInstruktorId());

			if (instruktor == null) {
				setText("Nie odnaleziono instruktora");
				return TEXT_RESULT;
			}

			kursant.setInstruktor(instruktor);
			getKursantMdt().makePersistent(kursant);

			setText("Kursant został poprawnie przypisany do instruktora");
			return TEXT_RESULT;
		}

		setText("Nie znaleziono kursanta");
		return TEXT_RESULT;
	}

	public String unassignKursant() {
		Kursant kursant = getKursantMdt().get(getKursantId());

		if (kursant != null) {
			kursant.setInstruktor(null);
			getKursantMdt().makePersistent(kursant);

			setText("Kursant nie posiada już instruktora instruktora");
			return TEXT_RESULT;
		}

		setText("Nie znaleziono kursanta");
		return TEXT_RESULT;
	}

	public InstruktorForm getForm() {
		if (form == null)
			form = new InstruktorForm();
		return form;
	}

	public void setForm(InstruktorForm form) {
		this.form = form;
	}

	public int getInstruktorId() {
		return instruktorId;
	}

	public void setInstruktorId(int instruktorId) {
		this.instruktorId = instruktorId;
	}

	public int getKursantId() {
		return kursantId;
	}

	public void setKursantId(int kursantId) {
		this.kursantId = kursantId;
	}

	private InstruktorMdt getInstruktorMdt() {
		if (instruktorMdt == null)
			instruktorMdt = new InstruktorMdt();
		return instruktorMdt;
	}

	public KursantMdt getKursantMdt() {
		if (kursantMdt == null)
			kursantMdt = new KursantMdt();
		return kursantMdt;
	}

	public void setKursantMdt(KursantMdt kursantMdt) {
		this.kursantMdt = kursantMdt;
	}
}
